#pragma

#include <iostream>
#include <cstdio>
#include <cstdarg>
#include <ctime>
#include <string>

// 日志等级
#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3
#define FATAL 4

#define SIZE 1024
// const char*类型元素的数组
const char *gLevelMap[] = { // 1.日志等级
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"};

// 日志功能：1.日志等级 2.日志时间 3.支持用自定义(日志内容，文件行，文件名)
void logMessage(int level, const char *format, ...)
{
#ifndef DEBUG_SHOW // 如果没定义DEBUG_SHOW,则表明不需要DEBUG调试展示，则会读取到这里，就不会展示以下的日志功能提供的各种信息。
    if (level == DEBUG)
        return; // DEBUG调试

#endif // 如果定义了DEBUG_SHOW,则表面需要DEBUG调试展示，则会读取到这里，就会展示以下的日志功能提供的各种信息

    char stdBuffer[SIZE];             // 标准信息部分
    time_t timestamp = time(NULL); // 2.日志时间

    // 把后面的内容打印到前面的字符串里。该函数专门为打印到字符设置的
    snprintf(stdBuffer, sizeof stdBuffer, "[%s] [%ld]", gLevelMap[level], timestamp); // 将 日志时间 和 日志等级 添加到标准信息部分中

    // ps:待学
    char logBuffer[SIZE]; // 标准信息部分
    va_list args;
    va_start(args, format);
    // vprintf(format,args);

    vsnprintf(logBuffer, sizeof logBuffer, format, args);
    va_end(args);

    printf("%s%s\n", stdBuffer, logBuffer);
}